package kr.ac.ssu.ss.nxtclient;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {
	
	private final static String IP = "192.168.1.101"; //"203.253.23.222";
	private final static int PORT = 8778;
	
	Socket socket = null;
	protected static OutputStream outStream;
	
    private Handler handler = new Handler();
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    	boolean result = super.onCreateOptionsMenu(menu);
    	
        getMenuInflater().inflate(R.menu.activity_main, menu);
        
        return result;
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // TODO Auto-generated method stub
        super.onOptionsItemSelected(item);

        switch (item.getItemId()) {
        
        case R.id.connectItem: // connect

            // 안내 메세지를 토스트로 출력한다.
            Toast.makeText(this, "Connecting...", Toast.LENGTH_LONG).show();

            // 서버 접속
            try {
				socket = new Socket(IP, PORT);
			} catch (UnknownHostException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
            
            return true;
            
        case R.id.quitItem: // quit

        	// 확인 창
            AlertDialog.Builder ad = new AlertDialog.Builder(MainActivity.this);
            ad.setIcon(android.R.drawable.ic_dialog_alert);
            ad.setTitle("Quit");
            ad.setMessage("Do you want to Quit?");
            ad.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    // 접속 종료
                	try {
                		if(socket != null) {
                			socket.close();
                		}
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}

                    // 프로그램 종료
                    finish();
                }
            }).setNegativeButton("No", null);
            ad.show();

            return true;
        }
        return false;
    }
    
    // 방향키 누름
    public void onButtonPressed(View view) {
    	Button forwardButton = (Button) findViewById(R.id.forwardButton);
    	Button backwardButton = (Button) findViewById(R.id.backwardButton);
    	Button turnRightButton = (Button) findViewById(R.id.turnRightButton);
    	Button turnLeftButton = (Button) findViewById(R.id.turnLeftButton);
    	Button stopButton = (Button) findViewById(R.id.stopButton);
    	
    	int viewId = view.getId();
    	int command = 0;
    	String commandStr = "";
    	
    	if(forwardButton.getId() == viewId) {	// forward
    		commandStr = "forward";
    		command = 1;
    	} else if(backwardButton.getId() == viewId) {	// backward
    		commandStr = "backward";
    		command = 2;
    	} else if(turnRightButton.getId() == viewId) {	// turnRight
    		commandStr = "turnRight";
    		command = 3;
    	} else if(turnLeftButton.getId() == viewId) {	// turnLeft
    		commandStr = "turnLeft";
    		command = 4;
    	} else if(stopButton.getId() == viewId) {	// stop
    		commandStr = "stop";
    		command = 5;
    	}
    	
    	Log.d("DEBUG", commandStr);
    	
    	
    	if(socket == null) {
			Toast.makeText(this, "Do first connecting. [Menu]-[Connect]", Toast.LENGTH_LONG).show();
			
		} else {
    		
	    	// send command
	    	try {
	    		outStream = socket.getOutputStream();
	    		outStream.write(command);
	    		outStream.flush();
	    		
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
    	
    	
    }
    
    // ========================================== //
    // back key double click
    // Back의 상태값을 저장하기 위한 변수
    boolean m_close_flag = false;

    // 일정 시간 후 상태값을 초기화하기 위한 핸들러
    Handler m_close_handler = new Handler() {
        public void handleMessage(Message msg) {
            m_close_flag = false;
        }
    };

	// Back 키가 터치되면 호출되는 메소드
	public void onBackPressed() {
		// m_close_flag 가 false 이면 첫번째로 키가 눌린 것이다.
		if (m_close_flag == false) { // Back 키가 첫번째로 눌린 경우

			// 안내 메세지를 토스트로 출력한다.
			Toast.makeText(this, "Press Back key one more.", Toast.LENGTH_LONG).show();

			// 상태값 변경
			m_close_flag = true;

			// 핸들러를 이용하여 3초 후에 0번 메세지를 전송하도록 설정한다.
			m_close_handler.sendEmptyMessageDelayed(0, 3000);

		} else { // Back 키가 3초 내에 연달아서 두번 눌린 경우
            
			// 액티비티를 종료하는 상위 클래스의 onBackPressed 메소드를 호출한다.
			super.onBackPressed();
		}
	}

	protected void onStop() {
		super.onStop();

		// 핸드러에 등록된 0번 메세지를 모두 지운다.
		this.m_close_handler.removeMessages(0);
	}
    // ========================================== //
}
